<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>CSS Transitions Test: Parsing transition-timing-function</title>
        <meta name="assert" content="Test checks that transition-timing-function values are parsed properly">
        <link rel="help" title="2.3. The 'transition-timing-function' Property" href="http://www.w3.org/TR/css3-transitions/#transition-timing-function-property">
        <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
        <meta name="flags" content="dom">
        
        <script src="/resources/testharness.js" type="text/javascript"></script>
        <script src="/resources/testharnessreport.js" type="text/javascript"></script>
        
        <script src="./support/vendorPrefix.js" type="text/javascript"></script>
        <script src="./support/helper.js" type="text/javascript"></script>
        
        <script id="metadata_cache">/*
        {
          "parse 'ease'": {},
          "parse 'linear'": {},
          "parse 'ease-in'": {},
          "parse 'ease-out'": {},
          "parse 'ease-in-out'": {},
          "parse 'step-start'": {},
          "parse 'step-end'": {},
          "parse 'cubic-bezier(0.1, 0.2, 0.3, 0.4)'": {},
          "parse 'cubic-bezier(0.1, -0.2, 0.3, -0.4)'": {},
          "parse 'cubic-bezier(0.1, 1.2, 0.3, 1.4)'": {},
          "parse 'steps(3, start)'": {},
          "parse 'steps(3, end)'": {},
          "parse 'steps(3)'": {},
          "parse 'cubic-bezier(foobar)'": { "flags": "invalid" },
          "parse 'steps(foobar)'": { "flags": "invalid" },
          "parse 'steps(3.3, end)'": { "flags": "invalid" },
          "parse 'steps(3, top)'": { "flags": "invalid" },
          "parse 'steps(-3, top)'": { "flags": "invalid" },
          "parse 'cubic-bezier(-0.1, -0.2, -0.3, -0.4)'": { "flags": "invalid" },
          "parse 'cubic-bezier(1.1, 1.2, 1.3, 1.4)'": { "flags": "invalid" }
        }
        */</script>
    </head>
    <body>
        <!-- required by testharnessreport.js -->
        <div id="log"></div>
        <!-- elements used for testing -->
        <div id="container">
            <div id="transition"></div>
        </div>

        <script>
            var transition = document.getElementById('transition');
            // "ease"
            var defaultValue = 'cubic-bezier(0.25, 0.1, 0.25, 1)';
            var values = {
                // keywords
                'ease': 'cubic-bezier(0.25, 0.1, 0.25, 1)',
                'linear': 'cubic-bezier(0, 0, 1, 1)',
                'ease-in': 'cubic-bezier(0.42, 0, 1, 1)',
                'ease-out': 'cubic-bezier(0, 0, 0.58, 1)',
                'ease-in-out': 'cubic-bezier(0.42, 0, 0.58, 1)',
                'step-start': 'steps(1, start)',
                'step-end': 'steps(1, end)',
                // cubic bezier
                'cubic-bezier(0.1, 0.2, 0.3, 0.4)': 'cubic-bezier(0.1, 0.2, 0.3, 0.4)',
                'cubic-bezier(0.1, -0.2, 0.3, -0.4)': 'cubic-bezier(0.1, -0.2, 0.3, -0.4)',
                'cubic-bezier(0.1, 1.2, 0.3, 1.4)': 'cubic-bezier(0.1, 1.2, 0.3, 1.4)',
                // steps
                'steps(3, start)': 'steps(3, start)',
                'steps(3, end)': 'steps(3, end)',
                'steps(3)': 'steps(3, end)',
                // invalid
                'cubic-bezier(foobar)': defaultValue,
                'steps(foobar)': defaultValue,
                'steps(3.3, end)': defaultValue,
                'steps(3, top)': defaultValue,
                'steps(-3, top)': defaultValue,
                // Both x values must be in the range [0, 1]
                'cubic-bezier(-0.1, -0.2, -0.3, -0.4)': defaultValue,
                'cubic-bezier(1.1, 1.2, 1.3, 1.4)': defaultValue
            };
            
            // these tests are supposed to fail and
            // possibly make the engine issue a parser warning
            var invalidTests = {
                'cubic-bezier(foobar)': true,
                'steps(foobar)': true,
                'steps(3.3, end)': true,
                'steps(3, top)': true,
                'steps(-3, top)': true,
                // Both x values must be in the range [0, 1]
                'cubic-bezier(-0.1, -0.2, -0.3, -0.4)': true,
                'cubic-bezier(1.1, 1.2, 1.3, 1.4)': true
            };
            
            for (var key in values) {
                if (Object.prototype.hasOwnProperty.call(values, key)) {
                    test(function() {
                        setStyle('#transition', {
                            'transition-timing-function': key
                        });
                        var result = computedStyle(transition, 'transition-timing-function');
                        assert_equals(result, values[key], "Expected computed value");
                    }, "parse '" + key + "'",
                    {
                        // mark tests that fail as such
                        flags: invalidTests[key] ? "invalid" : ""
                    });
                }
            }
        </script>
    </body>
</html>